﻿Imports System.Text
Public Class clsConversao

    Public Sub New()

        MyBase.New()

    End Sub

    Public Enum Saida

        Todas_minusculas = 0
        Todas_MAIUSCULAS = 1
        Primeira_Maiusculas = 2
        Primeiras_Maiusculas = 3

    End Enum
    Public Enum Idioma
        BR_BR = 0  ' Traduz de : Português - Brasil.
        PT_PT = 1  ' Traduz de : Brasil - Português.
        'Nota : O sistema rem linguagem por default em Português
    End Enum
    Dim strbFuncaoGeral As New StringBuilder
    Dim strGlobal As String
    Dim strGlobalFormat As String
    Private Property typTipo As Saida
    Private Property typExtenso As Idioma

    Public Function NumberToEuro(ByVal number As Decimal, ByVal Tipo As Saida, ByRef TipoIdioma As Idioma) As String

        strbFuncaoGeral.Remove(0, strbFuncaoGeral.Length)

        number = Format(Convert.ToDouble(number), "#,##0.00")

        Dim cent As Integer
        Try
            ' se for =0 retorna 0 eros
            If number = 0 Then
                MontaString("Zero Euros")
            End If
            ' Verifica a parte decimal, ou seja, os cêntimos
            cent = Decimal.Round((number - Int(number)) * 100, MidpointRounding.ToEven)
            ' Verifica apenas a parte inteira
            number = Int(number)
            ' Caso existam cêntimos

            If cent > 0 Then

                ' Caso seja 1 não coloca "euros" mas sim "euro"
                If number = 1 Then

                    MontaString("um Euro", True)
                    getDecimal(cent)
                    RetornaCentavos(cent)

                    ' Caso o valor seja inferior a 1 euro
                ElseIf number = 0 Then

                    getDecimal(cent)
                    RetornaCentavos(cent)

                Else

                    getInteger(number)
                    MontaString("euros", True)
                    getDecimal(cent)
                    RetornaCentavos(cent)

                End If

            Else

                ' Caso seja 1 não coloca "euros" mas sim "euro"
                If number = 1 Then

                    MontaString("um euro")

                Else

                    getInteger(number)
                    MontaString("euros")

                End If

            End If

        Catch ex As Exception
            Return ""
        End Try

        'Agregando
        typTipo = Tipo
        typExtenso = TipoIdioma
        fctFormatarSaida()
        TradPorExt()
        Return strGlobalFormat
    End Function

    ''' <summary>
    ''' Função auxiliar - Parte decimal a converter
    ''' </summary>
    ''' <param name="number">Parte decimal a converter</param>

    Public Function getDecimal(ByVal number As Byte) As String

        Try

            Select Case number

                Case 0

                    Return ""

                Case 1 To 19

                    Dim strArray() As String = {"um", "dois", "três", "quatro", "cinco", "seis",
                                                "sete", "oito", "nove", "dez", "onze",
                                                "doze", "treze", "catorze", "quinze",
                                                "dezasseis", "dezassete", "dezoito", "dezanove"}

                    MontaString(strArray(number - 1))

                Case 20 To 99

                    Dim strArray() As String = {"vinte", "trinta", "quarenta", "cinquenta",
                                                "sessenta", "setenta", "oitenta", "noventa"}

                    If (number Mod 10) = 0 Then

                        MontaString(strArray(number \ 10 - 2))

                    Else

                        MontaString(strArray(number \ 10 - 2), True)
                        getDecimal(number Mod 10)

                    End If

                Case Else

                    Return ""

            End Select

        Catch ex As Exception

            Return ""

        End Try

        Return ""

    End Function

    ''' <summary>
    ''' Função auxiliar - Parte inteira a converter
    ''' </summary>
    ''' <param name="number">Parte inteira a converter</param>

    Private Sub getInteger(ByVal number As Decimal)

        Try

            number = Int(number)

            Select Case number

                Case Is < 0

                    getInteger(-number)

                Case 0

                    Exit Sub

                Case 1 To 19

                    Dim strArray() As String = {"um", "dois", "três", "quatro", "cinco",
                                                "seis", "sete", "oito", "nove", "dez",
                                                "onze", "doze", "treze", "catorze", "quinze",
                                                "dezasseis", "dezassete", "dezoito", "dezanove"}

                    MontaString(strArray(number - 1))

                Case 20 To 99

                    Dim strArray() As String = {"vinte", "trinta", "quarenta", "cinquenta",
                                                "sessenta", "setenta", "oitenta", "noventa"}

                    If (number Mod 10) = 0 Then

                        MontaString(strArray(number \ 10 - 2))

                    Else

                        MontaString(strArray(number \ 10 - 2), True)
                        getInteger(number Mod 10)

                    End If

                Case 100

                    MontaString("Cem")

                Case 101 To 999

                    Dim strArray() As String = {"cento", "duzentos", "trezentos", "quatrocentos", "quinhentos",
                                                "seiscentos", "setecentos", "oitocentos", "novecentos"}

                    If (number Mod 100) = 0 Then

                        MontaString(strArray(number \ 100 - 1))

                    Else

                        MontaString(strArray(number \ 100 - 1), True)
                        getInteger(number Mod 100)

                    End If

                Case 1000 To 1999

                    Select Case (number Mod 1000)

                        Case 0

                            MontaString("mil")

                        Case Is <= 100

                            MontaString("mil", True)
                            getInteger(number Mod 1000)

                        Case Else

                            MontaString("mil,")
                            getInteger(number Mod 1000)

                    End Select

                Case 2000 To 999999

                    Select Case (number Mod 1000)

                        Case 0

                            getInteger(number \ 1000)
                            MontaString("mil")

                        Case Is <= 100

                            getInteger(number \ 1000)
                            MontaString("mil", True)
                            getInteger(number Mod 1000)
                            Exit Sub

                        Case Else

                            getInteger(number \ 1000)
                            MontaString("mil,")
                            getInteger(number Mod 1000)
                            Exit Sub

                    End Select
                    '====== Milhão Singular ======
                Case 1000000 To 1999999

                    Select Case (number Mod 1000000)

                        Case 0

                            MontaString("um milhão")

                        Case Is <= 100

                            getInteger(number \ 1000000)
                            MontaString("milhão", True)
                            getInteger(number Mod 1000000)

                        Case Else

                            getInteger(number \ 1000000)
                            MontaString("milhão,")
                            getInteger(number Mod 1000000)

                    End Select
                    '====  Milhão Plural ===
                Case 2000000 To 999999999

                    Select Case (number Mod 1000000)

                        Case 0

                            getInteger(number \ 1000000)
                            MontaString("milhões")
                            Exit Sub

                        Case Is <= 100

                            getInteger(number \ 1000000)
                            MontaString("milhões", True)
                            getInteger(number Mod 1000000)
                            Exit Sub

                        Case Else

                            getInteger(number \ 1000000)
                            MontaString("milhões,")
                            getInteger(number Mod 1000000)
                            Exit Sub
                    End Select
                    '--------- Singular : Bilhão ( 1000.000.000) (10^9) --------
                Case 1000000000 To 1999999999

                    Select Case (number Mod 1000000000)

                        Case 0

                            MontaString("um bilhão")
                            Exit Sub

                        Case Is <= 100

                            getInteger(number \ 1000000000)
                            MontaString("bilhão", True)
                            getInteger(number Mod 1000000000)
                            Exit Sub

                        Case Else

                            getInteger(number \ 1000000000)
                            MontaString("bilhão", True)
                            getInteger(number Mod 1000000000)
                            Exit Sub

                    End Select
                    '--------- Plural : Bilhões ( 1000.000.000) (10^9) --------
                    '200000000   '200000000
                Case 2000000000 To 999999999999

                    Select Case (number Mod 1000000000)

                        Case 0

                            getInteger(number \ 1000000000)
                            MontaString("bilhões")
                            Exit Sub

                        Case Is <= 100

                            getInteger(number \ 1000000000)
                            MontaString("bilhões", True)
                            getInteger(number Mod 1000000000)
                            Exit Sub

                        Case Else

                            getInteger(number \ 1000000000)
                            MontaString("bilhões,")
                            getInteger(number Mod 1000000000)
                            Exit Sub


                    End Select
                    '====================================================
                    '--------- Singular : Trilhão ( 1000.000.000.000) (10^12) --------
                    '3000000000
                    '2999999999          '3000000000
                Case 1000000000000 To 1999999999999

                    Select Case (number Mod 1000000000000)

                        Case 0

                            MontaString("um trilhão")
                            Exit Sub

                        Case Is <= 100

                            getInteger(number \ 1000000000000)
                            MontaString("trilhão", True)
                            getInteger(number Mod 1000000000000)
                            Exit Sub

                        Case Else

                            getInteger(number \ 1000000000000)
                            MontaString("trilhão", True)
                            getInteger(number Mod 1000000000000)
                            Exit Sub

                    End Select
                    '--------- Plural : Trilhões ( 1000.000.000) (10^12) --------



                Case Else

                    Select Case (number Mod 1000000000000)

                        Case 0

                            getInteger(number \ 1000000000000)
                            MontaString("trilhões")
                            Exit Sub

                        Case Is <= 100

                            getInteger(number \ 1000000000000)
                            MontaString("trilhões", True)
                            getInteger(number Mod 1000000000000)
                            Exit Sub

                        Case Else

                            getInteger(number \ 1000000000000)
                            MontaString("trilhões,")
                            getInteger(number Mod 1000000000000)
                            Exit Sub


                    End Select

            End Select

        Catch ex As Exception

        End Try

    End Sub

    Private Function RetornaCentavos(ByVal Centavos As Integer) As String

        If Centavos = 1 Then

            MontaString("cêntimo")

        Else

            MontaString("cêntimos")

        End If

        Return ""

    End Function

    Private Sub MontaString(ByVal strString As String,
                        Optional ByVal blnAdicionarCont As Boolean = False)

        If strbFuncaoGeral.Length = 0 Then

            strbFuncaoGeral.Append(strString & IIf(blnAdicionarCont = True, " e", ""))

        Else

            strbFuncaoGeral.Append(" " & strString & IIf(blnAdicionarCont = True, " e", ""))

        End If

    End Sub

    Private Sub fctFormatarSaida()

        Dim LetraMinuscula As String

        Try

            Select Case typTipo

                Case Saida.Todas_MAIUSCULAS
                    strGlobal = strbFuncaoGeral.ToString.ToUpper

                Case Saida.Todas_minusculas
                    strGlobal = strbFuncaoGeral.ToString.ToLower

                Case Saida.Primeiras_Maiusculas
                    strGlobal = StrConv(strbFuncaoGeral.ToString, VbStrConv.ProperCase)

                Case Saida.Primeira_Maiusculas
                    strGlobal = strbFuncaoGeral.ToString.ToLower
                    LetraMinuscula = Left(strbFuncaoGeral.ToString, 1)
                    LetraMinuscula = LetraMinuscula.ToUpper()
                    strGlobal = Replace(strbFuncaoGeral.ToString, LetraMinuscula.ToLower, LetraMinuscula, 1, 1)

                Case Else
                    strGlobal = strGlobal.ToString


            End Select

        Catch ex As Exception

        End Try

    End Sub
    Private Sub TradPorExt()


        Try

            Select Case typExtenso

                Case Idioma.BR_BR
                    strGlobalFormat = ModificaBR_BR((strGlobal))

                Case Idioma.PT_PT

                    strGlobalFormat = ModificaPT_PT((strGlobal))
                Case Else
                    strGlobalFormat = strGlobal.ToString


            End Select

        Catch ex As Exception

        End Try

    End Sub
    'Public Function ModificaPT_ENG(ByVal ConverteX As String) As String
    'Criar vector com algumas palavras em portugês.
    'Dim PT() As String = {"zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", "onze", "doze", "treze", "catorze", "quinze", _
    '"dezasseis", "dezassete", "dezoito", "dezanove"}
    'Criar vector com tradução para inglês.
    'Dim ENG() As String = {"naught", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", _
    '"sixteen", "seventeen", "eighteen", "nineteen"}

    'Cria dicionário (Tradutor Portugês-Inglês).
    'Dim DicPT_EN As New Dictionary(Of String, String)

    'For i As Integer = 0 To PT.GetUpperBound(0)
    'A palavra em PT é a chave; o valor é a palavra em ENG
    ' DicPT_EN(PT(i)) = ENG(i)
    'Next
    'Adicionar mais algumas palavras ao dicionário
    'DicPT_EN.Add("vinte", "twenty")
    'DicPT_EN.Add("trinta", "thirty")
    'DicPT_EN.Add("quarenta", "forty")
    'DicPT_EN.Add("cinquenta", "fifty")
    'DicPT_EN.Add("sessenta", "sixty")
    'DicPT_EN.Add("setenta", "seventy")
    'DicPT_EN.Add("oitenta", "eighty")
    'DicPT_EN.Add("noventa", "ninety")
    'DicPT_EN.Add("cem", "hundred")
    'DicPT_EN.Add("cento", "hundred")
    'DicPT_EN.Add("duzentos", "two hundred")
    'DicPT_EN.Add("trezentos", "three hundred")
    'DicPT_EN.Add("quatrocentos", "four hundred")
    'DicPT_EN.Add("quinhentos", "five hundred")
    'DicPT_EN.Add("seiscentos", "six hundred")
    'DicPT_EN.Add("setecentos", "seven hundred")
    'DicPT_EN.Add("oitocentos", "eight hundred")
    'DicPT_EN.Add("novecentos", "nine hundred")
    'DicPT_EN.Add("cêntimo", "cent")
    'DicPT_EN.Add("cêntimos", "cents")
    'DicPT_EN.Add("milhão", "million")
    'DicPT_EN.Add("milhões", "million")
    'DicPT_EN.Add("bilião", "billion")
    'DicPT_EN.Add("biliões", "billion")
    'Com virgula------
    'DicPT_EN.Add("mil", "thousand")
    'DicPT_EN.Add("mil,", "thousand,")
    'DicPT_EN.Add("milhão,", "million,")
    'DicPT_EN.Add("milhões,", "million,")
    'DicPT_EN.Add("bilião,", "billion,")
    'DicPT_EN.Add("biliões,", "billion,")
    '-----------------
    'DicPT_EN.Add("e", "and")
    'DicPT_EN.Add("euro", "pence")

    'Busca a frase para traduzir
    'Dim frasePT As String = ConverteX 'Form1.TextBox1.Text
    'Decompõe a frase em palavras
    'Dim Palavras() As String = frasePT.Split(" "c)
    'Cria uma variável para armazenar o resultado da tradução
    'Dim FraseEN As New StringBuilder()
    'Precorre Todas as palavras da string captada
    'For Each palavra As String In Palavras
    'If DicPT_EN.ContainsKey(palavra) Then
    ' Palavra traduzida
    '    FraseEN.Append(DicPT_EN(palavra) & " ")
    ' Else
    'Palavra não existe no dicionário : Mantém a palavra original.
    '      FraseEN.Append(palavra & " ")
    '   End If
    'Next


    'ModificaPT_ENG = FraseEN.ToString()
    'End Function
    Public Function ModificaBR_BR(ByVal ConverteX As String) As String
        Dim PT() As String = {"zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", "onze", "doze", "treze", "catorze", "quinze", _
       "dezasseis", "dezassete", "dezoito", "dezanove"}
        'Criar vector com tradução para Brasileiro.
        Dim BR() As String = {"zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", "onze", "doze", "treze", "quatorze", "quinze", _
      "dezesseis", "dezessete", "dezoito", "dezanove"}
        '========================================================================
        'Traduz de Portugês para Portugês-Brasil
        '========================================================================

        'Cria dicionário (Tradutor Portugês-Brasil).
        Dim DicBR_BR As New Dictionary(Of String, String)

        For i As Integer = 0 To PT.GetUpperBound(0)
            'A palavra em PT é a chave; o valor é a palavra em Brasil
            DicBR_BR(PT(i)) = BR(i)
        Next
        'Adicionar mais algumas palavras ao dicionário
        DicBR_BR.Add("bilião", "trilhão")
        DicBR_BR.Add("biliões", "trilhões")
        DicBR_BR.Add("biliões,", "trilhões,")
        ' DicBR_BR.Add("milhão", "bilhão")
        'DicBR_BR.Add("milhões", "bilhões")
        DicBR_BR.Add("mil milhões,", "bilhões,")
        DicBR_BR.Add("cêntimo", "centavo")
        DicBR_BR.Add("cêntimos", "centavos")
        DicBR_BR.Add("euro", "real")
        DicBR_BR.Add("euros", "reais")
        DicBR_BR.Add("euros,", "reais,")
        '--------------------------------
        DicBR_BR.Add("CÊNTIMO", "CENTAVO")
        DicBR_BR.Add("CÊNTIMOS", "CENTAVOS")
        DicBR_BR.Add("EURO", "REAL")
        DicBR_BR.Add("EUROS", "REAIS")
        DicBR_BR.Add("EUROS,", "REAIS,")
        '-------------------------------------
        DicBR_BR.Add("Cêntimo", "Centavo")
        DicBR_BR.Add("Cêntimos", "Centavos")
        DicBR_BR.Add("Euro", "Real")
        DicBR_BR.Add("Euros", "Reais")
        DicBR_BR.Add("Euros,", "Reais,")

        'Busca a frase para traduzir
        Dim FrasePT As String = ConverteX 'Form1.TextBox1.Text
        'Decompõe a frase em palavras
        Dim PalavrasX() As String = FrasePT.Split(" "c)
        'Cria uma variável para armazenar o resultado da tradução
        Dim FraseBR As New StringBuilder()
        'Precorre Todas as palavras da string captada
        For Each palavraX As String In PalavrasX
            If DicBR_BR.ContainsKey(palavraX) Then
                ' Palavra traduzida
                FraseBR.Append(DicBR_BR(palavraX) & " ")
            Else
                'Palavra não existe no dicionário : Mantém a palavra original.
                FraseBR.Append(palavraX & " ")
            End If
        Next
        'Mostra o resultado

        ModificaBR_BR = FraseBR.ToString()
    End Function
    Public Function ModificaPT_PT(ByVal ConverteX As String) As String
        Dim PT() As String = {"zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", "onze", "doze", "treze", "catorze", "quinze", _
       "dezasseis", "dezassete", "dezoito", "dezanove"}
        'Criar vector com tradução para Brasileiro.
        Dim BR() As String = {"zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", "onze", "doze", "treze", "quatorze", "quinze", _
        "dezesseis", "dezessete", "dezoito", "dezanove"}

        '========================================================================
        'Traduz de Portugês para Portugês-Brasil
        '========================================================================

        'Cria dicionário (Tradutor Portugês-Brasil).
        Dim DicPT_PT As New Dictionary(Of String, String)

        For i As Integer = 0 To BR.GetUpperBound(0)
            'A palavra em PT é a chave; o valor é a palavra em Brasil
            DicPT_PT(PT(i)) = PT(i)
        Next
        ' Dim TPC As String = Replace("um bilhão reais", " ", "")
        'Adicionar mais algumas palavras ao dicionário
        DicPT_PT.Add("trilhão", "bilião")
        DicPT_PT.Add("trilhões", "biliões")
        DicPT_PT.Add("trilhões,", "biliões,")
        DicPT_PT.Add("bilhões", "mil milhões")
        DicPT_PT.Add("bilhões,", "mil milhões,")
        DicPT_PT.Add("centavo", "cêntimo")
        DicPT_PT.Add("centavos", "cêntimos")
        DicPT_PT.Add("real", "euro")
        DicPT_PT.Add("reais", "euros")
        DicPT_PT.Add("reais,", "euros,")
        '-------------------------------
        DicPT_PT.Add("TRILHÃO", "BILIÃO")
        DicPT_PT.Add("TRILHÕES", "BILIÕES")
        DicPT_PT.Add("TRILHÕES,", "BILIÕES,")
        DicPT_PT.Add("BILHÃO", "MILHÃO")
        DicPT_PT.Add("BILHÕES", "MIL MILHÕES")
        DicPT_PT.Add("BILHÕES,", "MIL MILHÕES,")
        DicPT_PT.Add("CENTAVO", "CÊNTIMO")
        DicPT_PT.Add("CENTAVOS", "CÊNTIMOS")
        DicPT_PT.Add("REAL", "EURO")
        DicPT_PT.Add("REAIS", "EUROS")
        DicPT_PT.Add("REAIS,", "EUROS,")
        '-------------------------------
        DicPT_PT.Add("Trilhão", "Bilião")
        DicPT_PT.Add("Trilhões", "Biliões")
        DicPT_PT.Add("Trilhões,", "Biliões,")
        DicPT_PT.Add("Bilhão", "Milhão")
        DicPT_PT.Add("Bilhões", "Mil Milhões")
        DicPT_PT.Add("Bilhões,", "Mil Milhões,")
        DicPT_PT.Add("Centavo", "Cêntimo")
        DicPT_PT.Add("Centavos", "Cêntimos")
        DicPT_PT.Add("Real", "Euro")
        DicPT_PT.Add("Reais", "Euros")
        DicPT_PT.Add("Reais,", "Euros,")


        'Busca a frase para traduzir
        Dim FraseBR As String = ConverteX 'Form1.TextBox1.Text
        'Decompõe a frase em palavras
        Dim PalavrasX() As String = FraseBR.Split(" "c)
        'Cria uma variável para armazenar o resultado da tradução
        Dim FrasePT As New StringBuilder()
        'Precorre Todas as palavras da string captada
        For Each palavraX As String In PalavrasX
            If DicPT_PT.ContainsKey(palavraX) Then
                ' Palavra traduzida
                FrasePT.Append(DicPT_PT(palavraX) & " ")
            Else

                'Palavra não existe no dicionário : Mantém a palavra original.

                FrasePT.Append(palavraX & " ")



            End If
        Next
        'Tranforma unidades de Trilhões
        If FraseBR.Substring(0, 15) = "um bilhão euros" Then
            ModificaPT_PT = "mil milhões euros"
        ElseIf FraseBR.Substring(0, 15) = "UM BILHÃO EUROS" Then
            ModificaPT_PT = "MIL MILHÕES EUROS"
        ElseIf FraseBR.Substring(0, 15) = "Um Bilhão Euros" Then
            ModificaPT_PT = "Mil Milhões Euros"
        ElseIf FraseBR.Substring(0, 15) = "Um bilhão euros" Then
            ModificaPT_PT = "Mil milhões euros"
        ElseIf FraseBR.Substring(0, 9) = "um bilhão" Then
            ModificaPT_PT = "mil milhões" & Right(FraseBR.ToString, Len(FraseBR.ToString) - 9)
        ElseIf FraseBR.Substring(0, 9) = "UM BILHÃO" Then
            ModificaPT_PT = "MIL MILHÕES" & Right(FraseBR.ToString, Len(FraseBR.ToString) - 9)
        ElseIf FraseBR.Substring(0, 9) = "Um Bilhão" Then
            ModificaPT_PT = "Mil Milhões" & Right(FraseBR.ToString, Len(FraseBR.ToString) - 9)
        ElseIf FraseBR.Substring(0, 9) = "Um bilhão" Then
            ModificaPT_PT = "Mil milhões" & Right(FraseBR.ToString, Len(FraseBR.ToString) - 9)
        Else
            ModificaPT_PT = FrasePT.ToString()
        End If


    End Function



End Class
